<?php

/**
 * 模板方法模式
 * 
 * 概述：定义一个操作中算法的框架，而将一些步骤延迟都子类。使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。
 * 
 * 类型：行为类模式
 * 
 * 角色：
 *  由一个抽象类和一个（或一组）实现类通过继承结构组成。抽象类中包括，
 *  抽象方法。
 *  模板方法。
 *  
 * 优点：
 * 
 * 缺点：
 * 
 */


abstract class ArraySort
{
	protected abstract function sortMethod(&$array);
	
	public function showArray($array)
	{
		$this->sortMethod($array);
		var_dump($array);
	}
}

class AscSort extends ArraySort
{
	protected function sortMethod(&$array)
	{
		sort($array);
	}
}

class DescSort extends ArraySort
{
	protected function sortMethod(&$array)
	{
		rsort($array);
	}
}

class Client
{
	public static function main()
	{
		$array = array(12, 3, 6, 9, 2);
		$sort = new AscSort();
		$sort->showArray($array);
	}
}

Client::main();